package com.xx.rpc.core.remoting.invoker.router;

import com.xx.rpc.core.remoting.invoker.router.impl.*;

/**
 * 策略枚举
 *
 * @author hanxiyue
 */
public enum LoadBalance {


    RANDOM(new XxRpcLoadBalanceRandomStrategy()),//随机策略
    ROUND(new XxRpcLoadBalanceRoundStrategy()),//循环策略
    LRU(new XxRpcLoadBalanceLRUStrategy()),//最近最少使用
    LFU(new XxRpcLoadBalanceLFUStrategy()),//最近使用次数最少
    CONSISTENT_HASH(new XxRpcLoadBalanceConsistentHashStrategy());//单个JOB对应的每个执行器，使用频率最低的优先被选举


    public final XxRpcLoadBalance xxlRpcInvokerRouter;

    private LoadBalance(XxRpcLoadBalance xxlRpcInvokerRouter) {
        this.xxlRpcInvokerRouter = xxlRpcInvokerRouter;
    }


    public static LoadBalance match(String name, LoadBalance defaultRouter) {
        for (LoadBalance item : LoadBalance.values()) {
            if (item.name().equals(name)) {
                return item;
            }
        }
        return defaultRouter;
    }
}
